// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: braces fieldsfirst space lnc
package com.google.zxing.qrcode.detector;
import com.google.zxing.DecodeHintType;
import com.google.zxing.NotFoundException;
import com.google.zxing.ResultPoint;
import com.google.zxing.ResultPointCallback;
import com.google.zxing.common.BitMatrix;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
// Referenced classes of package com.google.zxing.qrcode.detector:
// FinderPattern, d, c, FinderPatternInfo
public class FinderPatternFinder
{
protected static final int MAX_MODULES = 57;
protected static final int MIN_SKIP = 3;
private static final int a = 2;
private static final int b = 8;
private final BitMatrix c;
private final List d;
private boolean e;
private final int f[];
private final ResultPointCallback g;
public FinderPatternFinder(BitMatrix bitmatrix)
{
this(bitmatrix, null);
}
public FinderPatternFinder(BitMatrix bitmatrix, ResultPointCallback resultpointcallback)
{
c = bitmatrix;
d = new ArrayList();
f = new int[5];
g = resultpointcallback;
}
private float a(int i, int j, int k, int l)
{
BitMatrix bitmatrix = c;
int i1 = bitmatrix.getHeight();
int ai[] = a();
int j1;
for (j1 = i; j1 >= 0 && bitmatrix.get(j, j1); j1--)
{
ai[2] = 1 + ai[2];
}
if (j1 >= 0)
{
for (; j1 >= 0 && !bitmatrix.get(j, j1) && ai[1] <= k; j1--)
{
ai[1] = 1 + ai[1];
}
if (j1 >= 0 && ai[1] <= k)
{
for (; j1 >= 0 && bitmatrix.get(j, j1) && ai[0] <= k; j1--)
{
ai[0] = 1 + ai[0];
}
if (ai[0] <= k)
{
int k1;
for (k1 = i + 1; k1 < i1 && bitmatrix.get(j, k1); k1++)
{
ai[2] = 1 + ai[2];
}
if (k1 != i1)
{
for (; k1 < i1 && !bitmatrix.get(j, k1) && ai[3] < k; k1++)
{
ai[3] = 1 + ai[3];
}
if (k1 != i1 && ai[3] < k)
{
for (; k1 < i1 && bitmatrix.get(j, k1) && ai[4] < k; k1++)
{
ai[4] = 1 + ai[4];
}
if (ai[4] < k && 5 * Math.abs((ai[0] + ai[1] + ai[2] + ai[3] + ai[4]) - l) < l * 2 && foundPatternCross(ai))
{
return a(ai, k1);
}
}
}
}
}
}
return (0.0F / 0.0F);
}
private static float a(int ai[], int i)
{
return (float)(i - ai[4] - ai[3]) - (float)ai[2] / 2.0F;
}
private int[] a()
{
f[0] = 0;
f[1] = 0;
f[2] = 0;
f[3] = 0;
f[4] = 0;
return f;
}
private float b(int i, int j, int k, int l)
{
BitMatrix bitmatrix = c;
int i1 = bitmatrix.getWidth();
int ai[] = a();
int j1;
for (j1 = i; j1 >= 0 && bitmatrix.get(j1, j); j1--)
{
ai[2] = 1 + ai[2];
}
if (j1 >= 0)
{
for (; j1 >= 0 && !bitmatrix.get(j1, j) && ai[1] <= k; j1--)
{
ai[1] = 1 + ai[1];
}
if (j1 >= 0 && ai[1] <= k)
{
for (; j1 >= 0 && bitmatrix.get(j1, j) && ai[0] <= k; j1--)
{
ai[0] = 1 + ai[0];
}
if (ai[0] <= k)
{
int k1;
for (k1 = i + 1; k1 < i1 && bitmatrix.get(k1, j); k1++)
{
ai[2] = 1 + ai[2];
}
if (k1 != i1)
{
for (; k1 < i1 && !bitmatrix.get(k1, j) && ai[3] < k; k1++)
{
ai[3] = 1 + ai[3];
}
if (k1 != i1 && ai[3] < k)
{
for (; k1 < i1 && bitmatrix.get(k1, j) && ai[4] < k; k1++)
{
ai[4] = 1 + ai[4];
}
if (ai[4] < k && 5 * Math.abs((ai[0] + ai[1] + ai[2] + ai[3] + ai[4]) - l) < l && foundPatternCross(ai))
{
return a(ai, k1);
}
}
}
}
}
}
return (0.0F / 0.0F);
}
private int b()
{
FinderPattern finderpattern;
Iterator iterator;
if (d.size() <= 1)
{
return 0;
}
finderpattern = null;
iterator = d.iterator();
_L5:
if (!iterator.hasNext()) goto _L2; else goto _L1
_L1:
FinderPattern finderpattern1;
finderpattern1 = (FinderPattern)iterator.next();
if (finderpattern1.a() < 2)
{
break MISSING_BLOCK_LABEL_99;
}
if (finderpattern != null) goto _L4; else goto _L3
_L3:
finderpattern = finderpattern1;
goto _L5
_L4:
e = true;
return (int)(Math.abs(finderpattern.getX() - finderpattern1.getX()) - Math.abs(finderpattern.getY() - finderpattern1.getY())) / 2;
_L2:
return 0;
finderpattern1 = finderpattern;
goto _L3
}
private boolean c()
{
float f1 = 0.0F;
int i = d.size();
Iterator iterator = d.iterator();
float f2 = 0.0F;
int j = 0;
while (iterator.hasNext())
{
FinderPattern finderpattern = (FinderPattern)iterator.next();
float f3;
Iterator iterator1;
float f4;
int k;
if (finderpattern.a() >= 2)
{
int l = j + 1;
f4 = f2 + finderpattern.getEstimatedModuleSize();
k = l;
} else
{
f4 = f2;
k = j;
}
j = k;
f2 = f4;
}
if (j >= 3)
{
f3 = f2 / (float)i;
for (iterator1 = d.iterator(); iterator1.hasNext();)
{
f1 += Math.abs(((FinderPattern)iterator1.next()).getEstimatedModuleSize() - f3);
}
if (f1 <= 0.05F * f2)
{
return true;
}
}
return false;
}
private FinderPattern[] d()
{
float f1 = 0.0F;
int i = d.size();
if (i < 3)
{
throw NotFoundException.getNotFoundInstance();
}
if (i > 3)
{
Iterator iterator1 = d.iterator();
float f3 = 0.0F;
float f4 = 0.0F;
while (iterator1.hasNext())
{
float f8 = ((FinderPattern)iterator1.next()).getEstimatedModuleSize();
f4 += f8;
f3 += f8 * f8;
}
float f5 = f4 / (float)i;
float f6 = (float)Math.sqrt(f3 / (float)i - f5 * f5);
Collections.sort(d, new d(f5, null));
float f7 = Math.max(0.2F * f5, f6);
for (int j = 0; j < d.size() && d.size() > 3; j++)
{
if (Math.abs(((FinderPattern)d.get(j)).getEstimatedModuleSize() - f5) > f7)
{
d.remove(j);
j--;
}
}
}
if (d.size() > 3)
{
for (Iterator iterator = d.iterator(); iterator.hasNext();)
{
f1 += ((FinderPattern)iterator.next()).getEstimatedModuleSize();
}
float f2 = f1 / (float)d.size();
Collections.sort(d, new c(f2, null));
d.subList(3, d.size()).clear();
}
FinderPattern afinderpattern[] = new FinderPattern[3];
afinderpattern[0] = (FinderPattern)d.get(0);
afinderpattern[1] = (FinderPattern)d.get(1);
afinderpattern[2] = (FinderPattern)d.get(2);
return afinderpattern;
}
protected static boolean foundPatternCross(int ai[])
{
boolean flag;
int i;
int j;
flag = true;
i = 0;
j = 0;
_L7:
if (i >= 5) goto _L2; else goto _L1
_L1:
int i1 = ai[i];
if (i1 != 0) goto _L4; else goto _L3
_L3:
return false;
_L4:
j += i1;
i++;
continue; /* Loop/switch isn't completed */
_L2:
if (j < 7) goto _L3; else goto _L5
_L5:
int k = (j << 8) / 7;
int l = k / 2;
if (Math.abs(k - (ai[0] << 8)) >= l || Math.abs(k - (ai[flag] << 8)) >= l || Math.abs(k * 3 - (ai[2] << 8)) >= l * 3 || Math.abs(k - (ai[3] << 8)) >= l || Math.abs(k - (ai[4] << 8)) >= l)
{
flag = false;
}
return flag;
if (true) goto _L7; else goto _L6
_L6:
}
FinderPatternInfo b(Map map)
{
boolean flag;
int i;
int j;
int k;
int l;
int ai[];
int i1;
boolean flag1;
int j1;
if (map != null && map.containsKey(DecodeHintType.TRY_HARDER))
{
flag = true;
} else
{
flag = false;
}
i = c.getHeight();
j = c.getWidth();
k = (i * 3) / 228;
if (k < 3 || flag)
{
l = 3;
} else
{
l = k;
}
ai = new int[5];
i1 = l - 1;
flag1 = false;
j1 = l;
while (i1 < i && !flag1)
{
ai[0] = 0;
ai[1] = 0;
ai[2] = 0;
ai[3] = 0;
ai[4] = 0;
int k1 = 0;
int l1 = 0;
while (k1 < j)
{
if (c.get(k1, i1))
{
if ((l1 & 1) == 1)
{
l1++;
}
ai[l1] = 1 + ai[l1];
} else
if ((l1 & 1) == 0)
{
if (l1 == 4)
{
if (foundPatternCross(ai))
{
if (handlePossibleCenter(ai, i1, k1))
{
boolean flag2;
if (e)
{
flag2 = c();
} else
{
int i2 = b();
FinderPattern afinderpattern[];
int j2;
int k2;
if (i2 > ai[2])
{
k2 = i1 + (i2 - ai[2] - 2);
j2 = j - 1;
} else
{
j2 = k1;
k2 = i1;
}
i1 = k2;
k1 = j2;
flag2 = flag1;
}
ai[0] = 0;
ai[1] = 0;
ai[2] = 0;
ai[3] = 0;
ai[4] = 0;
flag1 = flag2;
j1 = 2;
l1 = 0;
} else
{
ai[0] = ai[2];
ai[1] = ai[3];
ai[2] = ai[4];
ai[3] = 1;
ai[4] = 0;
l1 = 3;
}
} else
{
ai[0] = ai[2];
ai[1] = ai[3];
ai[2] = ai[4];
ai[3] = 1;
ai[4] = 0;
l1 = 3;
}
} else
{
l1++;
ai[l1] = 1 + ai[l1];
}
} else
{
ai[l1] = 1 + ai[l1];
}
k1++;
}
if (!foundPatternCross(ai) || !handlePossibleCenter(ai, i1, j))
{
continue;
}
j1 = ai[0];
if (e)
{
flag1 = c();
}
i1 += j1;
}
afinderpattern = d();
ResultPoint.orderBestPatterns(afinderpattern);
return new FinderPatternInfo(afinderpattern);
}
protected BitMatrix getImage()
{
return c;
}
protected List getPossibleCenters()
{
return d;
}
protected boolean handlePossibleCenter(int ai[], int i, int j)
{
int k;
float f1;
float f2;
boolean flag;
boolean flag1;
k = ai[0] + ai[1] + ai[2] + ai[3] + ai[4];
f1 = a(ai, j);
f2 = a(i, (int)f1, ai[2], k);
flag = Float.isNaN(f2);
flag1 = false;
if (flag) goto _L2; else goto _L1
_L1:
float f3;
boolean flag2;
f3 = b((int)f1, (int)f2, ai[2], k);
flag2 = Float.isNaN(f3);
flag1 = false;
if (flag2) goto _L2; else goto _L3
_L3:
float f4;
int l;
f4 = (float)k / 7F;
l = 0;
_L9:
int i1;
boolean flag3;
i1 = d.size();
flag3 = false;
if (l >= i1) goto _L5; else goto _L4
_L4:
FinderPattern finderpattern1 = (FinderPattern)d.get(l);
if (!finderpattern1.a(f4, f2, f3)) goto _L7; else goto _L6
_L6:
d.set(l, finderpattern1.b(f2, f3, f4));
flag3 = true;
_L5:
if (!flag3)
{
FinderPattern finderpattern = new FinderPattern(f3, f2, f4);
d.add(finderpattern);
if (g != null)
{
g.foundPossibleResultPoint(finderpattern);
}
}
flag1 = true;
_L2:
return flag1;
_L7:
l++;
if (true) goto _L9; else goto _L8
_L8:
}
}